<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>栈</title>
	</head>
	<body>
	</body>
</html>
<script type="text/javascript">
	// 基于数组实现栈
	
	// 栈区：编译器自动分配释放，存放函数的参数值，局部变量的值等，其操作方式类似于数据结构的栈
	// 堆区：一般是由程序员分配释放，若程序员不释放的话，程序结束时可能由OS回收，值得注意的是他与数据结构的堆是两回事
	// 		 分配方式类似于数据结构的链表
	// 栈的常用操作  
	/*
	push（element）：添加一个新元素到栈顶位置
	pop()：移除栈顶的元素，同时返回被移除的元素
	peek()：返回栈顶的元素，不对栈做任何修改
	isEmpty():如果栈里没有任何元素就返回true，否则返回false
	size(): 返回栈里的元素个数，这个方法和数组的length属性相似
	toString()：将栈结构的内容以字符形式返回
	
	*/
	function Stack(){
		// 栈中的属性
		this.items =[]
		// 栈的操作
		// 1.将元素压入栈
		Stack.prototype.push = function(element){
			this.items.push(element)
		}
		// 2.从栈中取出元素
		Stack.prototype.pop = function(){
			return this.items.pop()
		}
		
		// 3.查看栈顶元素
		Stack.prototype.peek = function(){
			return this.items[this.items.length - 1]
		}
		
		// 4.判断栈是否为空
		Stack.prototype.isEmpty = function(){
			return this.items.length == 0
		}
		
		// 5.获取栈中元素的个数
		Stack.prototype.size = function(){
			return this.items.length
		}
		// 6.toString方法
		Stack.prototype.toString = function(){
			return this.items.join(',')
		}
		// 7.clear清除
		Stack.prototype.clear = function(){
			this.items = []
		}
	}
	// z栈的使用
	var s = new Stack()
	s.push(20)
	s.push(10)
	s.push(100)
	console.log('push',s)
	// s.pop()
	console.log('pop',s)
	s.peek()
	console.log('peek',s)
	console.log('isEmpty',s.isEmpty())
	s.size()
	console.log('size',s)
	s.toString()
	console.log('toString',s.toString())
	// s.clear()
	// console.log('size',s)
</script>
